#include "app_bluetooth.h"
#include "log/log.h"
#include  <unistd.h>
#include <stdio.h>


//缓存读取出的蓝牙数据
static char read_buffer[1024];
static int read_buffer_len=0;
static char recv_header[2]={0xF1,0xDD};
/**
 * @brief  是否是 OK/r/n
 * @param dev 设备指针
 * @return 状态
 */
static wait_ack(Device *dev){
    //等待一会
    usleep(1000*50);
    char buffer[4];
    read(dev->fd, buffer, 4);
    if(memcmp(buffer, "OK\r\n", 4) == 0){
        return 0;
    }else{
        return -1;
    }

}

/**
 * @brief 移除字符
 */
static void removeReadBuffer(   int len)
{
    memmove(read_buffer, read_buffer+len, read_buffer_len-len);
    read_buffer_len-=len;
 
}

 

/**
 * @brief 测试蓝牙状态
 * @param dev 设备指针
 * @return 状态
 */
 
int app_bluetooth_status(Device *dev)
{
    write(dev->fd, "AT", 2);

    return  wait_ack(dev);
}

/**
 * @brief 重命名蓝牙
 * @param dev 设备指针
 * @param name 新名字
 * @return 状态
 */ 
int app_bluetooth_rename(Device *dev,  char *name )
{
    write(dev->fd, "AT+NAME", 7);
    write(dev->fd, name, strlen(name));
    write(dev->fd, "\r\n", 2);
    
    return wait_ack(dev);
}


 /**
 * @brief 设置蓝牙波特率
 * @param dev 设备指针
 * @param br 波特率
 * @return 状态
 */  
int app_bluetooth_setBraudRate(Device *dev, BT_BraudRate br)
{
    write(dev->fd, "AT+BAUD", 7) ;
    write(dev->fd, br, 1) ;
    write(dev->fd, "\r\n", 2);
    return wait_ack(dev);
}

/**
 * @brief 重置蓝牙
 * @param dev 设备指针
 * @return 状态
 */ 
int app_bluetooth_reset(Device *dev )
{
    write(dev->fd, "AT+RESET\r\n", 10);
    return wait_ack(dev);
}


/**
 * @brief  设置蓝牙网络id
 * @param dev 设备指针
 * @param version 网络id
 * @return 状态
 */ 
 int app_bluetooth_setNetId(Device *dev, char *netId)
 {
     write(dev->fd, "AT+NETID", 8);
     write(dev->fd, netId, strlen(netId));
     write(dev->fd, "\r\n", 2);
     return wait_ack(dev);
 }

 


 /**
 * @brief  设置蓝牙mac地址
 * @param dev 设备指针
 * @param version mac地址
 * @return 状态
 */
int app_bluetooth_setMAddr(Device *dev, char *maddr)
{
    write(dev->fd, "AT+MADDR", 8);
    write(dev->fd, maddr, strlen(maddr));
    write(dev->fd, "\r\n", 2);
    return wait_ack(dev);
}



/**
 * @brief  从蓝牙读取数据后处理
 * @param dev 设备指针
 * @param data 数据
 * @return 长度
 *  三种情况 ： 1 “OK\r\n” 2   “蓝牙mesh格式数据 ” 3 其他无用数据
 * 一次读取的蓝牙数据很可能不是一个完整的数据帧，必须所以要把数据帧拼接完整  
 * 完整数据     例子：f1 dd 07 23 23 ff ff 41 42 43
        f1 dd : 固定的头部
        07： 之后数据的长度（5-16之间） 
        23 23：对端（发送方）的MADDR
        ff ff: 我的MADDR或ffff(群发)
        41 42 43：发送的数据
  */

 int  app_bluetooth_postRead(Device *dev,  char *data,   int len)
 {
    memcpy(read_buffer+read_buffer_len ,data,len );
    read_buffer_len+=len;
    if(read_buffer_len<4){  //一定是不完整的数据帧 ，所以先放在缓存即可不需要返回
        return 0;
    }

    //遍历缓存数据
    int i ;
    for( i=0;i<read_buffer_len;i++)
    {
        if(memcmp(read_buffer+i, "OK\r\n", 4) == 0)
        {   // 如果遇到 OK\r\n 则通过位移抹掉 之前且包括OK\r\n的内容    此处存疑？？
                 removeReadBuffer(i+4);
                 return 0;
        }else if (memcmp(read_buffer+i, recv_header, 2)==2)  //如果存在开头
        {   //移除左侧数据
            removeReadBuffer(i);     
            //判断数据的完整性
            if(read_buffer_len<read_buffer[2]+3) 
            {
                return 0;
            }
                //数据完整，返回数据
                int data_len= read_buffer[2]+3;
                memset(data, 0, data_len);
                //变为格式： connectType id_len msg_len id msg
                data[0]=CONN_BT;
                data[1]=2;
                data[2]=read_buffer[2]-4;
                memcpy(data+3,read_buffer+3,2);
                memcpy(data+5,read_buffer+7,data[2]);

                // 从缓存中移除数据
                removeReadBuffer(data_len); 
                return data[2]+5;
           
            
        }
        
    }
    removeReadBuffer(i); //存疑？ 没有头 又没有ack 就是无用数据


 }


 /**
  * @brief  写入蓝牙前的数据
  * @param dev 设备指针
  * @param data 数据 : 格式：  connectType id_len msg_len id msg -> AT_MESH\0ff ff msg \r\n
  * @return 长度
  */
 int app_bluetooth_preWrite(Device *dev, char *data, int len)
 {
    //AT_MESH\0 
    int data_len= 12+ data[2];
    char blue_data[data_len];

    memcpy(blue_data, "AT+MESH", 8);
//id
    char* id= data[3];
    memcpy(blue_data+8, id, 2);

//msg
    int  msg_len= data[2];
    char* msg= data+5;
   memcpy(blue_data+10, msg, msg_len);

    memcpy(blue_data+10+msg_len, "\r\n", 2);

    //要将原有数据清空 在换成新数据
    memset(data, 0, len);
    memcpy(data, blue_data, data_len);

    return data_len;
 }